#include "audioinput.h"
#include "module_pcmin.h"
#include <QTime>

AudioInput::AudioInput(const QAudioFormat &format)
    : m_format(format)
{
    open(QIODevice::WriteOnly);
    pcmin_module_register();

    m_task_timer.setInterval(1);
    connect(&m_task_timer, SIGNAL(timeout()), this, SLOT(AudioFrameAdjust()));
    m_task_timer.start();
}

AudioInput::~AudioInput()
{
    close();
}

qint64 AudioInput::readData(char *data, qint64 maxlen)
{
    Q_UNUSED(data);
    Q_UNUSED(maxlen);

    return 0;
}

//void AudioInput::CreateRunThread()
//{
//    m_thread = new QThread;
//    connect(m_thread, SIGNAL(started()), this, SLOT(AudioFrameAdjust()));
//    m_thread->start(); // qt线程中的死循环为什么会阻塞ui，线程之间没有时间片机制吗
//}

void AudioInput::AudioFrameAdjust()
{
    /* 4096个字节代表1024个采样点，16bit双通道 */
    if (m_queue.size() >= 4096) {
        //qDebug("%lld ", m_queue.size());
        for (int i = 0; i < 4096; i++)
            m_audiodata[i] = m_queue.dequeue();

        if (!pcmin_module_inputflag) { // 如果空闲
            pcmin_module_inputflag = 1; // 上锁
            int tick = QTime::currentTime().msecsSinceStartOfDay();
            pcmin_module_putdata((char *)(m_audiodata), 4096, tick);
            pcmin_module_inputflag = 0; // 释放锁
        } else {
            // 可以增加死循环等锁被释放，保证数据不丢失
        }
    }
}

// 麦克风每次传入的数据
qint64 AudioInput::writeData(const char *data, qint64 len)
{
    // 为什么len每次都是7057，和麦克风相关吗？能手动设置吗？不是采样深度的整数倍，
    // 而且没有地方设置输出时每帧字节数大小，
    // 需要自己做个缓存把送往解码器的每帧控制在4096字节
    // 而且还需要自己做帧时间戳匹配，有点坑

    //TODO: 先用queue代替一下循环缓存，以后再加上循环缓存的模块
    for (int i = 0; i < len; i++)
        m_queue.enqueue(data[i]);

    return len;
}
